from flask import Blueprint, render_template, request, jsonify

from fund.fund_util import get_fund_data
from fund.get_history_data import update_single
from my_const import MY_FUND_YML
from util.yml_util import read_fund_yml, write_fund_yml

fund_config_bp = Blueprint('fund_config', __name__)


@fund_config_bp.route('/fund-config')
def fund_config():
    """基金配置管理页面（原index路由功能）"""
    config = read_fund_yml(MY_FUND_YML)
    funds = {k: v for k, v in config.items() if not k.startswith('#')}
    return render_template('fund_list.html', funds=funds)


@fund_config_bp.route('/fund-config/<fund_id>', methods=['GET'])
def get_fund(fund_id):
    """获取单个基金的详细信息"""
    try:
        # 读取基金配置
        config = read_fund_yml(MY_FUND_YML)

        # 检查基金是否存在
        if fund_id not in config or fund_id.startswith('#'):
            return jsonify({
                "success": False,
                "error": f"基金ID {fund_id} 不存在"
            }), 404

        # 获取基金信息
        fund = config[fund_id]

        # 返回成功响应
        return jsonify({
            "success": True,
            "fund": {
                "id": fund_id,
                "code": fund.get('code'),
                "name": fund.get('name')
            }
        })

    except Exception as e:
        # 错误处理
        return jsonify({
            "success": False,
            "error": f"获取基金信息失败：{str(e)}"
        }), 500


@fund_config_bp.route('/fund-config/add', methods=['POST'])
def add_fund():
    """处理添加基金的AJAX请求"""
    try:
        # 从JSON获取数据（AJAX请求）
        data = request.get_json()
        fund_id = data.get('fund_id')
        code = data.get('code', '').strip()
        name = data.get('name', '').strip()

        # 检查fund code是不是6位数字
        if not (len(code) == 6 and code.isdigit()):
            return jsonify({
                "success": False,
                "error": f"基金代码 {code} 错误，应该是6位数字"
            })

        # 读取现有配置
        config = read_fund_yml(MY_FUND_YML)

        # 检查ID是否冲突（UUID冲突概率极低，仅做保险）
        if fund_id in config:
            return jsonify({
                "success": False,
                "error": "ID冲突，请关闭弹窗重新添加"
            })

        # 检查基金代码是否已存在（可选，避免重复添加）
        for fund in config.values():
            if fund.get('code') == code:
                return jsonify({
                    "success": False,
                    "error": f"基金代码 {code} 已存在"
                })

        if not name:
            fund_data = get_fund_data(code)
            name = fund_data['fund_name']

        # 添加新基金
        config[fund_id] = {"code": code, "name": name}
        write_fund_yml(config, MY_FUND_YML)  # 保存配置

        # get history data for this new fund:
        update_single(code)

        # 返回成功响应
        return jsonify({"success": True, "message": "添加成功",
                        "data": {"fund_code": code, "fund_name": name}})

    except Exception as e:
        # 错误处理
        return jsonify({"success": False, "error": f"添加失败：{str(e)}"})


# 编辑基金接口（返回JSON，不跳转）
@fund_config_bp.route('/fund-config/edit/<fund_id>', methods=['POST'])
def edit_fund(fund_id):
    config = read_fund_yml(MY_FUND_YML)
    fund = config.get(fund_id)

    if not fund:
        return jsonify({"success": False, "error": "基金不存在"}), 404

    # 接收表单数据（支持JSON和表单格式）
    if request.is_json:
        data = request.get_json()
    else:
        data = request.form

    # 验证基金代码（6位数字）
    new_code = data.get('code', '').strip()
    if not (len(new_code) == 6 and new_code.isdigit()):
        return jsonify({
            "success": False,
            "error": f"基金代码 {new_code} 错误，应该是6位数字"
        }), 400

    # 更新基金信息
    fund['code'] = new_code
    fund['name'] = data.get('name', '').strip()

    # 保存配置
    if write_fund_yml(config, MY_FUND_YML):
        # 返回更新后的信息，供前端同步
        return jsonify({
            "success": True,
            "fund": {
                "id": fund_id,
                "code": fund['code'],
                "name": fund['name']
            }
        })
    else:
        return jsonify({"success": False, "error": "编辑失败，请重试"}), 500


# 删除基金
@fund_config_bp.route('/fund-config/delete/<fund_id>', methods=['POST'])
def delete_fund(fund_id):
    config = read_fund_yml(MY_FUND_YML)

    try:
        if fund_id in config:
            del config[fund_id]
            if write_fund_yml(config, MY_FUND_YML):
                return jsonify({
                    'success': True,
                    'message': '基金删除成功'
                })
            else:
                raise Exception('写入配置文件失败')
        else:
            raise Exception('基金不存在')
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 400
